'''
北京大学电子教参服务平台爬虫v1.1
使用方法：
    1.转到目标书的页面，点击在线阅读
    2.在线阅读页面上，F12-F5-网络-img，寻找书页的网址
        例：http://162.105.138.126/OnLineReader/command/imagepage.ashx?objID=obj201306047qul6pld0blzbwox0000053634&metaId=u.meta20130417jpng7qul6pld0000054063&OrgId=apabi_usp&Ip=undefined&scale=0.0994399106730857&width=65.1&height=93&pageid=2&ServiceType=Imagepage&scaleType=1&OrWidth=654.666718416712&OrHeight=943.599888076482&testres=&debug=&SessionId=173918342039250A&UserName=%E6%9D%A5%E8%87%AA%2010.2.103.1%20%E7%9A%84%E7%94%A8%E6%88%B7&cult=CN&rights=1-0_00&time=2021-03-19%2011:15:45&sign=C8A8F5806556F0A273C6B09CC4D65A2E
    3.复制进link
    4.页码数自行把握，注意此处第一页的索引是1而不是0，最后一页记得左闭右开，自行+1
    5.过一段时间后需要更新链接，重新点击在线阅读，自行把握时间
    6.爬取结果在data/(你填的书名)
注意事项：
    本程序仅供技术交流，技术交流后请自行删除！请勿真正用于爬取数据！由此造成的侵权问题，本开发者概不负责！
    本程序仅供技术交流，技术交流后请自行删除！请勿真正用于爬取数据！由此造成的侵权问题，本开发者概不负责！
    本程序仅供技术交流，技术交流后请自行删除！请勿真正用于爬取数据！由此造成的侵权问题，本开发者概不负责！
'''
import requests
import time
import os
import re

class Spider:
    def __init__(self,bookname,link,pagerange=(1,2)):
        self.savefolder='data//{}'.format(bookname)
        self.link=conv(link)
        self.pr=pagerange

        t1 = time.time()
        self.read()
        print('{:.2f} secs.'.format(time.time() - t1))

    def read(self):
        for i in range(self.pr[0],self.pr[1]):
            url=self.link.format(i)
            self.forward(url,str(i))

    def forward(self, url, pagename):
        t=time.time()
        time.sleep(0.4) #你自己看着办
        r=requests.get(url)
        print('Get {} takes {:.2f} secs.'.format(pagename,time.time()-t))
        self.write(pagename, r.content, savefolder=self.savefolder)
        return

    def write(self,pagename,content,savefolder,ext='.png'):
        mkfolder(savefolder)
        with open(savefolder+'//'+pagename+ext,'wb') as f:
            f.write(content)
        print("{} written".format(savefolder+'//'+pagename+ext))
        return

def mkfolder(folder):
    if not os.path.exists(folder):
        os.makedirs(folder)
    return


#针对链接的字符串处理
def conv(str):

    pat = r"(?<={}).+?(?={})"
    pat1 = re.compile(pat.format('&width=','&'))
    pat2 = re.compile(pat.format('&height=','&'))
    pat3 = re.compile(pat.format('&pageid=','&'))

    #我瞎填的，你自己看着办
    str = re.sub(pat1, "6510", str)
    str = re.sub(pat2, "9300", str)
    str = re.sub(pat3, "{}", str)
    return str

if __name__ == '__main__':

    bookname='概率与统计'   #自己记得填，不要多本书搞在一起了
    link='' #记得填
    pages=(458,601)   #第一页是1，不要写成0，最后一页左闭右开自行+1

    s = Spider(bookname, link, pages)
